home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / UTILITIE / CONVERSI / 1396.ZIP / UU.ASM < prev    next >
Assembly Source File  |  1988-09-04  |  11KB  |  318 lines

  1.                 name    UUDECODE
  2.                 page    55,132
  3.                 title   'UUDECODE.ASM'
  4. ;
  5. ; UUDECODE.ASM -- UUDecodes a UUEncoded Binary File
  6. ;
  7. ; Copyright (C) 1988, by Theodore A. Kaldis
  8. ;
  9. ; To assemble and link this program into the executable UUDECODE.EXE:
  10. ;
  11. ;               C>MASM UU;
  12. ;               C>LINK UU;
  13. ;               C>EXEPACK UU.EXE UUDECODE.EXE
  14. ;
  15. ;-------------------------------------------
  16. TAB             EQU     9
  17. LF              EQU     10
  18. CR              EQU     13
  19. SPC             EQU     20h
  20. CMD_TAIL        EQU     80h
  21. ;-------------------------------------------
  22. CODE            SEGMENT PARA PUBLIC 'CODE'
  23.                 ASSUME  CS:CODE,DS:DSEG,SS:SSEG,ES:DSEG
  24. ;-------------------------------------------
  25. UUDECODE        PROC    FAR
  26.                 MOV     AX,DSEG
  27.                 MOV     ES,AX
  28.                 MOV     SI,CMD_TAIL
  29.                 MOV     DI,OFFSET INP_FILE
  30.                 CLD
  31.                 LODSB
  32.                 CMP     AL,0
  33.                 JE      CHK_DOS
  34. STRIP_CT:       LODSB
  35.                 CMP     AL,SPC
  36.                 JBE     STRIP_CT
  37. CT_CHAR:        CMP     AL,SPC
  38.                 JBE     CHK_DOS
  39.                 STOSB
  40.                 LODSB
  41.                 JMP     SHORT CT_CHAR
  42. ;-------------------------------------------
  43. CHK_DOS:        PUSH    ES
  44.                 POP     DS
  45.                 MOV     AH,30h
  46.                 INT     21h
  47.                 CMP     AL,2
  48.                 JAE     PROG_GO
  49.                 MOV     DX,OFFSET MSG_V1
  50.                 MOV     AH,9
  51.                 INT     21h
  52.                 MOV     AH,0
  53.                 INT     21h
  54. ;-------------------------------------------
  55. PROG_GO:        CMP     INP_FILE,0
  56.                 JNE     OPEN_INP_FIL
  57.                 MOV     DX,OFFSET PR_INP
  58.                 MOV     CX,PR_INP_LEN
  59.                 MOV     BX,1
  60.                 MOV     AH,40h
  61.                 INT     21h
  62.                 MOV     DX,OFFSET INP_FILE
  63.                 MOV     CX,40
  64.                 MOV     BX,0
  65.                 MOV     AH,3Fh
  66.                 INT     21h
  67.                 MOV     BX,AX
  68.                 SUB     BX,2
  69.                 MOV     INP_FILE[BX],0
  70. OPEN_INP_FIL:   MOV     DX,OFFSET INP_FILE
  71.                 MOV     AX,3D00h
  72.                 INT     21h
  73.                 JNC     INP_OPEN
  74.                 JMP     INP_ERR
  75. ;-------------------------------------------
  76. INP_OPEN:       MOV     INP_HANDLE,AX
  77.                 CALL    READ_FILE
  78. GET_OUT_FIL:    CALL    GET_LINE
  79.                 MOV     SI,OFFSET LINE_IN
  80.                 MOV     DI,OFFSET OUT_FILE
  81.                 LODSB
  82.                 CMP     AL,'b'
  83.                 JNE     GET_OUT_FIL
  84.                 LODSB
  85.                 CMP     AL,'e'
  86.                 JNE     GET_OUT_FIL
  87.                 LODSB
  88.                 CMP     AL,'g'
  89.                 JNE     GET_OUT_FIL
  90.                 LODSB
  91.                 CMP     AL,'i'
  92.                 JNE     GET_OUT_FIL
  93.                 LODSB
  94.                 CMP     AL,'n'
  95.                 JNE     GET_OUT_FIL
  96. STRIP_SPC:      LODSB
  97.                 CMP     AL,' '
  98.                 JE      STRIP_SPC
  99. STRIP_NUM:      LODSB
  100.                 CMP     AL,32
  101.                 JNE     STRIP_NUM
  102. GET_OUT:        LODSB
  103.                 CMP     AL,32
  104.                 JE      GET_OUT
  105.                 CMP     AL,0
  106.                 JE      OUT_FIN
  107.                 STOSB
  108.                 JMP     SHORT GET_OUT
  109. ;-------------------------------------------
  110. OUT_FIN:        MOV     DX,OFFSET OUT_FILE
  111.                 MOV     CX,0
  112.                 MOV     LINE_LEN,CL
  113.                 MOV     AH,3Ch
  114.                 INT     21h
  115.                 JNC     OUT_OPEN
  116.                 JMP     OUT_ERR
  117. ;-------------------------------------------
  118. OUT_OPEN:       MOV     OUT_HANDLE,AX
  119.                 MOV     DI,OFFSET OUT_BUF
  120. NEW_LINE:       CALL    GET_LINE
  121.                 MOV     SI,OFFSET LINE_IN
  122.                 LODSB
  123.                 SUB     AL,32
  124.                 CMP     AL,0
  125.                 JE      PROG_END
  126.                 MOV     LINE_LEN,AL
  127. NN_0:           LODSB
  128.                 MOV     AH,AL
  129.                 LODSB
  130.                 DEC     SI
  131.                 SUB     AX,2020h
  132.                 MOV     CL,2
  133.                 SHL     AH,CL
  134.                 MOV     CL,4
  135.                 SHR     AL,CL
  136.                 OR      AL,AH
  137.                 STOSB
  138.                 INC     BUF_LEN
  139.                 DEC     LINE_LEN
  140.                 CMP     LINE_LEN,0
  141.                 JNE     NN_1
  142.                 JMP     SHORT NEW_LINE
  143. ;-------------------------------------------
  144. NN_1:           LODSB
  145.                 MOV     AH,AL
  146.                 LODSB
  147.                 DEC     SI
  148.                 SUB     AX,2020h
  149.                 MOV     CL,4
  150.                 SHL     AH,CL
  151.                 MOV     CL,2
  152.                 SHR     AL,CL
  153.                 OR      AL,AH
  154.                 STOSB
  155.                 INC     BUF_LEN
  156.                 DEC     LINE_LEN
  157.                 CMP     LINE_LEN,0
  158.                 JNE     NN_2
  159.                 JMP     SHORT NEW_LINE
  160. ;-------------------------------------------
  161. NN_2:           LODSB
  162.                 MOV     AH,AL
  163.                 LODSB
  164.                 SUB     AX,2020h
  165.                 MOV     CL,6
  166.                 SHL     AH,CL
  167.                 OR      AL,AH
  168.                 STOSB
  169.                 INC     BUF_LEN
  170.                 DEC     LINE_LEN
  171.                 CMP     LINE_LEN,0
  172.                 JNE     NN_0
  173.                 JMP     SHORT NEW_LINE
  174. ;-------------------------------------------
  175. PROG_END:       CALL    GET_LINE
  176.                 MOV     SI,OFFSET LINE_IN
  177.                 LODSB
  178.                 CMP     AL,'e'
  179.                 JNE     END_ERR_C
  180.                 LODSB
  181.                 CMP     AL,'n'
  182.                 JNE     END_ERR_C
  183.                 LODSB
  184.                 CMP     AL,'d'
  185.                 JE      FILE_END
  186. END_ERR_C:      CALL    END_ERR
  187. FILE_END:       CALL    WRITE_FILE
  188. FILE_END_X:     MOV     AH,4Ch
  189.                 INT     21h
  190. ;-------------------------------------------
  191. GET_LINE        PROC    NEAR
  192.                 MOV     POS_STOR,DI
  193.                 MOV     SI,BUF_POS
  194. FLUSH_LIN:      MOV     DI,OFFSET LINE_IN
  195.                 MOV     CX,80
  196.                 XOR     AL,AL
  197.                 REP     STOSB
  198.                 MOV     DI,OFFSET LINE_IN
  199. NEXT_CHR:       LODSB
  200.                 DEC     READ_COUNT
  201.                 CMP     READ_COUNT,0
  202.                 JA      NOT_MT
  203.                 PUSH    AX
  204.                 CALL    WRITE_FILE
  205.                 CALL    READ_FILE
  206.                 POP     AX
  207. NOT_MT:         CMP     AL,96
  208.                 JNE     NOT_HI
  209.                 SUB     AL,64
  210. NOT_HI:         CMP     AL,13
  211.                 JE      LAST_CHR
  212.                 STOSB
  213.                 INC     LINE_LEN
  214.                 CMP     LINE_LEN,80
  215.                 JNE     NEXT_CHR
  216. STRIP_HEAD:     LODSB
  217.                 DEC     READ_COUNT
  218.                 CMP     AL,10
  219.                 JNE     STRIP_HEAD
  220.                 JMP     SHORT FLUSH_LIN
  221. ;-------------------------------------------
  222. LAST_CHR:       INC     SI
  223.                 DEC     READ_COUNT
  224.                 MOV     BUF_POS,SI
  225.                 MOV     DI,POS_STOR
  226.                 RET
  227. GET_LINE        ENDP
  228. ;-------------------------------------------
  229. WRITE_FILE      PROC    NEAR
  230.                 MOV     DX,OFFSET OUT_BUF
  231.                 MOV     CX,BUF_LEN
  232.                 MOV     BUF_LEN,0
  233.                 MOV     BX,OUT_HANDLE
  234.                 MOV     AH,40h
  235.                 INT     21h
  236.                 JNC     WRITE_GOOD
  237. OUT_ERR:        PUSH    AX
  238.                 MOV     DX,OFFSET ERR_OUT
  239.                 MOV     CX,ERR_OUT_LEN
  240.                 MOV     BX,1
  241.                 MOV     AH,40h
  242.                 INT     21h
  243.                 POP     AX
  244.                 JMP     FILE_END_X
  245. ;-------------------------------------------
  246. WRITE_GOOD:     MOV     POS_STOR,OFFSET OUT_BUF
  247.                 RET
  248. WRITE_FILE      ENDP
  249. ;-------------------------------------------
  250. READ_FILE       PROC    NEAR
  251.                 MOV     DX,OFFSET DATA_BUF
  252.                 MOV     CX,0FE00h
  253.                 MOV     BX,INP_HANDLE
  254.                 MOV     AH,3Fh
  255.                 INT     21h
  256.                 JC      INP_ERR
  257.                 CMP     AX,0
  258.                 JNE     READ_CHAR
  259.                 CALL    END_ERR
  260.                 JMP     FILE_END_X
  261. ;-------------------------------------------
  262. READ_CHAR:      MOV     READ_COUNT,AX
  263.                 MOV     SI,OFFSET DATA_BUF
  264.                 RET
  265. ;-------------------------------------------
  266. INP_ERR:        PUSH    AX
  267.                 MOV     DX,OFFSET ERR_INP
  268.                 MOV     CX,ERR_INP_LEN
  269.                 MOV     BX,1
  270.                 MOV     AH,40h
  271.                 INT     21h
  272.                 POP     AX
  273.                 JMP     FILE_END_X
  274. READ_FILE       ENDP
  275. ;-------------------------------------------
  276. END_ERR         PROC    NEAR
  277.                 MOV     DX,OFFSET ERR_END
  278.                 MOV     CX,ERR_END_LEN
  279.                 MOV     BX,1
  280.                 MOV     AH,40h
  281.                 INT     21h
  282.                 RET
  283. END_ERR         ENDP
  284. UUDECODE        ENDP
  285. CODE            ENDS
  286. ;-------------------------------------------
  287. DSEG            SEGMENT PARA PUBLIC 'DATA'
  288. BUF_START       EQU     OFFSET DATA_BUF
  289. MSG_V1          DB      'This Program Requires DOS Version 2.0 '
  290.                 DB      'or higher.',CR,LF,'$'
  291. PR_INP          DB      CR,LF,'Input path/file:  '
  292. PR_INP_LEN      EQU     $-PR_INP
  293. ERR_INP         DB      'Input file error.',CR,LF
  294. ERR_INP_LEN     EQU     $-ERR_INP
  295. ERR_OUT         DB      'Output file error.',CR,LF
  296. ERR_OUT_LEN     EQU     $-ERR_OUT
  297. ERR_END         DB      'End not found.',CR,LF
  298. ERR_END_LEN     EQU     $-ERR_END
  299. BUF_POS         DW      BUF_START
  300. INP_HANDLE      DW      ?
  301. OUT_HANDLE      DW      ?
  302. READ_COUNT      DW      0
  303. BUF_LEN         DW      0
  304. POS_STOR        DW      ?
  305. LINE_LEN        DB      0
  306. INP_FILE        DB      40 DUP(0)
  307. OUT_FILE        DB      15 DUP(0)
  308. LINE_IN         DB      80 DUP (?)
  309. OUT_BUF         DB      80 DUP (?)
  310. DATA_BUF        DB      0FE00h DUP (?)
  311. DSEG            ENDS
  312. ;-------------------------------------------
  313. SSEG            SEGMENT PARA STACK 'STACK'
  314.                 DW      100 DUP (?)
  315. SSEG            ENDS
  316. ;-------------------------------------------
  317.                 END     UUDECODE
  318.